package blog.spring.db.dao;


import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.Session;

public interface IBaseDAO<T> {
	public Session getCurrentSession();
	/**
	 * 插入一个实体
	 * @param entity 要插入的对象
	 */
	public void insert(T entity);

	/**
	 * 删除一个实体
	 * @param entity 要删除的对象(持久化)
	 */
	public void delete(T entity);

	/**
	 * 更新一个实体
	 * @param entity 要更新的对象(持久化)
	 */
	public void update(T entity);

	/**
	 * 根据ID查询实体
	 * @param id 编号
	 * @return 查询到的实体对象
	 */
	public T selectById(int id);

	/**
	 * 根据指定属性名和属性值查询实体(通常是唯一性的属性)
	 * @param paramName 属性名
	 * @param name 属性值
	 * @return 返回查询到的第一条结果
	 */
	public T selectByName(String paramName, String name);

	/**
	 * 根据name查询实体
	 * @param name 代表name属性的值
	 * @return 查询到的对象
	 */
	public T selectByName(String name);

	/**
	 * 根据name查询是否存在同名实体
	 * @param name 属性值
	 * @return 是否或
	 */
	public boolean selectByNameIsExist(String name);

	/**
	 * 分页查询
	 * @param pageNum 页码
	 * @param pageSize 显示数量
	 * @param name 排序名称(如果不排序则为空)
	 * @param sort 排序方式(asc/desc)
	 * @return 查询到的结果列表
	 */
	public List<T> selectList(Integer pageNum, Integer pageSize, String name,
			String sort);

	/**
	 * 分页搜索
	 * @param conditions 键值对条件集合
	 * @param pageNum 页码
	 * @param pageSize 显示数量
	 * @param name 排序名称(如果不排序则为空)
	 * @param sort 排序方式(asc/desc)
	 * @param islike 是否模糊搜索
	 * @return 搜索到的结果列表
	 */
	public List<T> searchList(Map<String, Object> conditions, Integer pageNum,
			Integer pageSize, String name, String sort, Boolean islike);

	/**
	 * 单个对象搜索(在不确定是否搜索结果只有一个时不建议使用此方法)
	 * @param conditions 键值对条件集合
	 * @param islike 是否模糊搜索
	 * @return 返回结果中的第一个对象
	 */
	public T searchUnique(Map<String, Object> conditions, Boolean islike);

	/**
	 * [根]最底层的查询API
	 * @param hql 指定基本HQL语句
	 * @param conditions 参数
	 * @param pageNum 页码
	 * @param pageSize 显示数量
	 * @param name 排序列名
	 * @param sort 排序方式
	 * @param islike 是否模糊搜索
	 * @return
	 */
	List<T> searchListWithTheBasicHql(String hql,
			Map<String, Object> conditions, Integer pageNum, Integer pageSize,
			String name, String sort, Boolean islike);

	Query getQueryWithTheBasicHql(String hql,
			Map<String, Object> conditions, Integer pageNum, Integer pageSize,
			String name, String sort, Boolean islike);

	/**
	 * 查询全部
	 * @return
	 */
	List<T> selectAll();

	/**
	 * 查询总数量
	 * @return
	 */
	int selectAllCount();

	/**
	 * 搜索结果总数量
	 * @param conditions 搜索条件
	 * @return
	 */
	int searchCount(Map<String, Object> conditions);

}
